<?php

declare(strict_types=1);

namespace sheep\channel;

use think\Model;
use think\facade\Log;
use yunwuxin\Notification;
use yunwuxin\notification\Channel;
use yunwuxin\notification\Notifiable;

class WechatOfficialAccount extends Channel
{

    public function __construct()
    {
    }


    /**
     * 发送 微信模板消息
     *
     * @param  Notifiable  $notifiable       // 通知用户
     * @param  Notification $notification
     * @return void
     */
    public function send($notifiable, Notification $notification)
    {
        $params = $this->getMessage($notifiable, $notification);

        if ($params && isset($params['openid']) && isset($params['template_id']) && $params['template_id']) {
            $params['touser'] = $params['openid'];
            unset($params['openid']);

            try {
                // 发送模板消息
                $result = app('shop.wechat.official_account')->template_message->send($params);
                if ($result['errcode'] != 0) {
                    // 短信发送失败
                    Log::error('公众号模板消息发送失败：用户：' . $notifiable['id'] . '；类型：' . get_class($notification) . "；发送类型：" . $notification->event . "；错误信息：" . json_encode($result, JSON_UNESCAPED_UNICODE));
                } else {
                    // 发送成功
                    $notification->sendOk('WechatOfficialAccount');
                }
            } catch (\Exception $e) {
                // 因为配置较麻烦，这里捕获异常防止因为缺少字段，导致队列一直执行不成功
                Log::error('公众号模板消息发送失败，捕获异常：用户：' . $notifiable['id'] . '；类型：' . get_class($notification) . "；发送类型：" . $notification->event . "；错误信息：" . $e->getMessage());
            }
            return true;
        }

        // 没有openid
        Log::error('公众号模板消息发送失败，没有 openid：用户：' . $notifiable['id'] . '；类型：' . get_class($notification) . "；发送类型：" . $notification->event);
        return false;
    }
}
